package partner_admin_api

import (
	"gitee.com/theegg/go-brick/app/model/partner/partner_admin/partner_admin_permissions"
	"gitee.com/theegg/go-brick/app/service/app"
	"gitee.com/theegg/go-brick/app/service/help/cstruct"
	"github.com/gin-gonic/gin"
	"strconv"
)

// 获取管理菜单列表
func AdminPermissionList(c *gin.Context) {
	// 检验参数
	var validaParams partner_admin_permissions.AdminPermissionQueryParams
	if err := c.ShouldBind(&validaParams); err != nil {
		app.NewResponse(c).JsonReturn(false, "bind-json-"+err.Error(), nil)
		return
	}

	currentPartnerAdminUser, errCau := GetLoginPartnerAdminUser(c)
	if errCau != nil {
		app.NewResponse(c).JsonReturn(false, "用户未登录!", nil)
		return
	}

	// 获取用户所有的permissionIds
	allPermissionIds, errUp := currentPartnerAdminUser.GetUserAllPermissionIds()
	if errUp != nil {
		app.NewResponse(c).JsonReturn(false, errUp.Error(), nil)
		return
	}

	// 查询数据
	data, err := partner_admin_permissions.GetDataList(cstruct.StructToMap(validaParams), allPermissionIds)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), data)
		return
	}

	app.NewResponse(c).JsonReturn(true, "获取数据成功", data)
	return
}

// 获取菜单详情
func AdminPermissionDetail(c *gin.Context) {

	idStr := c.PostForm("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	// 选项数据
	returnData := make(map[string]interface{})

	currentPartnerAdminUser, errCau := GetLoginPartnerAdminUser(c)
	if errCau != nil {
		app.NewResponse(c).JsonReturn(false, "用户未登录!", nil)
		return
	}

	allPermissions, err := currentPartnerAdminUser.GetUserAllPermissions()
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	selectData := partner_admin_permissions.BuildPermissionSelectTree(allPermissions, 0, 2)

	returnData["parent_select_options"] = selectData
	if id == 0 {
		app.NewResponse(c).JsonReturn(true, "获取数据成功", returnData)
		return
	}

	// 如果存在ID, 获取具体的详情
	item, errItem := partner_admin_permissions.GetItemById(id)
	if errItem != nil {
		app.NewResponse(c).JsonReturn(false, errItem.Error(), nil)
		return
	}

	data := make(map[string]interface{})
	data["id"] = item.Id
	data["route"] = item.Route
	data["pid"] = item.Pid
	data["http_method"] = item.HttpMethod
	data["name"] = item.Name
	data["slug"] = item.Sign

	returnData["item"] = data

	app.NewResponse(c).JsonReturn(true, "获取数据成功", returnData)
	return
}

// 添加管理菜单
func AdminPermissionAdd(c *gin.Context) {

	//　检测ID
	idStr := c.PostForm("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	var modelPap *partner_admin_permissions.PartnerAdminPermissions
	if id > 0 {
		modelPap, err = partner_admin_permissions.GetItemById(id)
		if err != nil {
			app.NewResponse(c).JsonReturn(false, err.Error(), nil)
			return
		}
	} else {
		modelPap = new(partner_admin_permissions.PartnerAdminPermissions)
	}

	var validaParams partner_admin_permissions.AdminPermissionAddParams
	if err := c.ShouldBind(&validaParams); err != nil {
		app.NewResponse(c).JsonReturn(false, "bind-json-"+err.Error(), nil)
		return
	}

	// 检测pid
	var parent *partner_admin_permissions.PartnerAdminPermissions
	if validaParams.Pid > 0 {
		var errParent error
		parent, errParent = partner_admin_permissions.GetItemById(validaParams.Pid)
		if errParent != nil {
			app.NewResponse(c).JsonReturn(false, errParent.Error(), nil)
			return
		}

		if parent == nil {
			app.NewResponse(c).JsonReturn(false, "对不起, 指定的上级不存在", nil)
			return
		}

		currentPartnerAdminUser, errCau := GetLoginPartnerAdminUser(c)
		if errCau != nil {
			app.NewResponse(c).JsonReturn(false, "用户未登录!", nil)
			return
		}

		allPermissions, err := currentPartnerAdminUser.GetUserAllPermissions()
		if err != nil {
			app.NewResponse(c).JsonReturn(false, "对不起, 获取权限失败", nil)
			return
		}

		if _, ok := allPermissions[validaParams.Pid]; !ok {
			app.NewResponse(c).JsonReturn(false, "对不起, 您没有操作此权限的权利", nil)
			return
		}
	}

	errAu := modelPap.AddOrUpdateItem(validaParams, parent)
	if errAu != nil {
		app.NewResponse(c).JsonReturn(false, errAu.Error(), nil)
		return
	}

	app.NewResponse(c).JsonReturn(true, "添加数据成功", nil)
	return
}

// 删除管理菜单
func AdminPermissionDel(c *gin.Context) {
	idStr := c.PostForm("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	// 是否登录用户
	currentPartnerAdminUser, errCau := GetLoginPartnerAdminUser(c)
	if errCau != nil {
		app.NewResponse(c).JsonReturn(false, "用户未登录!", nil)
		return
	}

	// 1. 获取用户所有的permissionIds
	allPermissionIds, errUp := currentPartnerAdminUser.GetUserAllPermissionIds()
	if errUp != nil {
		app.NewResponse(c).JsonReturn(false, errUp.Error(), nil)
		return
	}

	// 2. 用户是否拥有此权限
	hasPermission := false
	for _, vId := range allPermissionIds {
		if id == vId {
			hasPermission = true
		}
	}

	if !hasPermission {
		app.NewResponse(c).JsonReturn(false, "您没有删除此数据的权限", nil)
		return
	}

	// 删除
	ok, err := partner_admin_permissions.DeleteAdminPermission(id)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	if !ok {
		app.NewResponse(c).JsonReturn(false, "对不起，删除数据发生未知错误,请联系客服!", nil)
		return
	}

	app.NewResponse(c).JsonReturn(true, "删除成功成功", nil)
	return
}
